package gui.tree;

import java.awt.Component;
import java.io.File;

import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultTreeCellRenderer;

/** 
 * Questa classe consente di visualizzare in una struttura ad albero, il contenuto del file system relativo al
 *  pc su cui si opera, assegnando a file e directory le icone di sistema (ovverosia ad esse associate dal 
 *  sistema operativo).
 */
public class MyTreeCellRenderer extends DefaultTreeCellRenderer{
	
	private static final long serialVersionUID = -8038247326841588275L;
	
	/** 
	 * JFileChooser's gateway al file system del pc su cui si opera.
	 */
	private FileSystemView fileSystemView;
	
	/** 
	 * Questo costruttore crea una nuova istanza MyTreeCellRenderer inizializzandone il campo fileSystemView mediante
	 *  il parametro fornito come argomento.
	 * 
	 * @param fileSystemView oggetto necessario all'inizializzazione del campo di cui sopra.
	 */
	public MyTreeCellRenderer(FileSystemView fileSystemView) {
		this.fileSystemView = fileSystemView;
	}
	
	/** 
	 * Questo metodo configura il renderer (utilizzato per visualizzare il contenuto del file system relativo
	 *  al pc su cui si opera su cui si opera) basandosi sui parametri passati come argomento.
	 * 
	 * @return il Component che il renderer usa per visualizzare il file system.
	 */
	public Component getTreeCellRendererComponent(	JTree tree,
													Object value, 
													boolean sel, 
													boolean expanded,
													boolean leaf, 
													int row, 
													boolean hasFocus ) {
		
		Component rc = super.getTreeCellRendererComponent(	tree, 
															value,
															sel, 
															expanded, 
															leaf, 
															row, 
															hasFocus );
		
		if (rc instanceof JLabel && value instanceof File) {
			
			JLabel jl = (JLabel) rc;
			File f = (File) value;
			
			try{
				jl.setText(fileSystemView.getSystemDisplayName(f)) ;
				jl.setIcon(fileSystemView.getSystemIcon(f));
				}catch(java.lang.NullPointerException e){ }
			}
			return rc;
		}
	}
